package com.share.oauth.interceptor;

import com.share.common.userinfo.Token;
import com.share.common.userinfo.TokenValidate;
import com.share.common.userinfo.UserUtil;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 这个拦截统一做登录的处理
 * 现在还没有生效 所以这个拦截还没有配置
 */
public class CurrentUserInterceptor implements HandlerInterceptor {
    // 不能这么在这里写变量来计算这个这个请求与是有还是没有的

    private final Logger logger = Logger.getLogger(this.getClass());


    /**
     * 当前系统处理前
     * 就要设置好当前系统
     * 的当前用户
     *
     * @param request  request
     * @param response response
     * @param handler  handler
     * @return 是否能通过
     * @throws Exception
     */
    @Override
    //在请求处理之前进行调用（Controller方法调用之前）
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String path = request.getServletPath();
        logger.info("请求的url路径为" + path);
        if (SkipValidateURL.contains(path)) {
            logger.debug("该路径为被拦截");
            return true;
        }
        String tokenId = request.getParameter(Token.token);
        logger.debug("传过来的tokenId" + tokenId);
        Token token = TokenValidate.getTokenByTokenID(tokenId);
        logger.debug("当前拿到的token为" + token);
        UserUtil.setCurrentUser(token);
        return false;
    }

    //请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    //在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理)
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // TODO: 2017/12/15 想在这里进行处理很多东西 比如可以每次返回到前段的码不一样
        // TODO: 2017/12/15 遗留问题 想在这这里处理每次返回给前段的token或者userInfo都可以进行不一样编码 应该可以防止爬虫机制了吧
        // TODO: 2017/12/15  还可以写一个防止暴力破解的问题 暴力破解的问题也要重视一些吧


    }
}
